<!DOCTYPE html>
<html>
<!-- Created by GNU Texinfo 7.1.1, https://www.gnu.org/software/texinfo/ -->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- Copyright © 1988-2023 Free Software Foundation, Inc.

Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Funding Free Software", the Front-Cover
Texts being (a) (see below), and with the Back-Cover Texts being (b)
(see below).  A copy of the license is included in the section entitled
"GNU Free Documentation License".

(a) The FSF's Front-Cover Text is:

A GNU Manual

(b) The FSF's Back-Cover Text is:

You have freedom to copy and modify this GNU Manual, like GNU
     software.  Copies published by the Free Software Foundation raise
     funds for GNU development. -->
<title>Per-Function Data (GNU Compiler Collection (GCC) Internals)</title>

<meta name="description" content="Per-Function Data (GNU Compiler Collection (GCC) Internals)">
<meta name="keywords" content="Per-Function Data (GNU Compiler Collection (GCC) Internals)">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta name="viewport" content="width=device-width,initial-scale=1">

<link href="index.html" rel="start" title="Top">
<link href="Option-Index.html" rel="index" title="Option Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Target-Macros.html" rel="up" title="Target Macros">
<link href="Storage-Layout.html" rel="next" title="Storage Layout">
<link href="Run_002dtime-Target.html" rel="prev" title="Run-time Target">
<style type="text/css">
<!--
a.copiable-link {visibility: hidden; text-decoration: none; line-height: 0em}
span:hover a.copiable-link {visibility: visible}
strong.def-name {font-family: monospace; font-weight: bold; font-size: larger}
-->
</style>


</head>

<body lang="en">
<div class="section-level-extent" id="Per_002dFunction-Data">
<div class="nav-panel">
<p>
Next: <a href="Storage-Layout.html" accesskey="n" rel="next">Storage Layout</a>, Previous: <a href="Run_002dtime-Target.html" accesskey="p" rel="prev">Run-time Target Specification</a>, Up: <a href="Target-Macros.html" accesskey="u" rel="up">Target Description Macros and Functions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<h3 class="section" id="Defining-data-structures-for-per_002dfunction-information_002e"><span>18.4 Defining data structures for per-function information.<a class="copiable-link" href="#Defining-data-structures-for-per_002dfunction-information_002e"> &para;</a></span></h3>
<a class="index-entry-id" id="index-per_002dfunction-data"></a>
<a class="index-entry-id" id="index-data-structures"></a>

<p>If the target needs to store information on a per-function basis, GCC
provides a macro and a couple of variables to allow this.  Note, just
using statics to store the information is a bad idea, since GCC supports
nested functions, so you can be halfway through encoding one function
when another one comes along.
</p>
<p>GCC defines a data structure called <code class="code">struct function</code> which
contains all of the data specific to an individual function.  This
structure contains a field called <code class="code">machine</code> whose type is
<code class="code">struct machine_function *</code>, which can be used by targets to point
to their own specific data.
</p>
<p>If a target needs per-function specific data it should define the type
<code class="code">struct machine_function</code> and also the macro <code class="code">INIT_EXPANDERS</code>.
This macro should be used to initialize the function pointer
<code class="code">init_machine_status</code>.  This pointer is explained below.
</p>
<p>One typical use of per-function, target specific data is to create an
RTX to hold the register containing the function&rsquo;s return address.  This
RTX can then be used to implement the <code class="code">__builtin_return_address</code>
function, for level 0.
</p>
<p>Note&mdash;earlier implementations of GCC used a single data area to hold
all of the per-function information.  Thus when processing of a nested
function began the old per-function data had to be pushed onto a
stack, and when the processing was finished, it had to be popped off the
stack.  GCC used to provide function pointers called
<code class="code">save_machine_status</code> and <code class="code">restore_machine_status</code> to handle
the saving and restoring of the target specific information.  Since the
single data area approach is no longer used, these pointers are no
longer supported.
</p>
<dl class="first-deffn first-defmac-alias-first-deffn">
<dt class="deffn defmac-alias-deffn" id="index-INIT_005fEXPANDERS"><span class="category-def">Macro: </span><span><strong class="def-name">INIT_EXPANDERS</strong><a class="copiable-link" href="#index-INIT_005fEXPANDERS"> &para;</a></span></dt>
<dd><p>Macro called to initialize any target specific information.  This macro
is called once per function, before generation of any RTL has begun.
The intention of this macro is to allow the initialization of the
function pointer <code class="code">init_machine_status</code>.
</p></dd></dl>

<dl class="first-deftypevr first-deftypevar-alias-first-deftypevr">
<dt class="deftypevr deftypevar-alias-deftypevr" id="index-init_005fmachine_005fstatus"><span class="category-def">Variable: </span><span><code class="def-type">void (*)(struct function *)</code> <strong class="def-name">init_machine_status</strong><a class="copiable-link" href="#index-init_005fmachine_005fstatus"> &para;</a></span></dt>
<dd><p>If this function pointer is non-<code class="code">NULL</code> it will be called once per
function, before function compilation starts, in order to allow the
target to perform any target specific initialization of the
<code class="code">struct function</code> structure.  It is intended that this would be
used to initialize the <code class="code">machine</code> of that structure.
</p>
<p><code class="code">struct machine_function</code> structures are expected to be freed by GC.
Generally, any memory that they reference must be allocated by using
GC allocation, including the structure itself.
</p></dd></dl>

</div>
<hr>
<div class="nav-panel">
<p>
Next: <a href="Storage-Layout.html">Storage Layout</a>, Previous: <a href="Run_002dtime-Target.html">Run-time Target Specification</a>, Up: <a href="Target-Macros.html">Target Description Macros and Functions</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Option-Index.html" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>
